﻿using System;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            //var a = new A();
            //BaseA ba = a;
            //var b = new B<A>();
            //IA<A> ib = b;
            // IA<BaseA> ib = b;  // 这样会报错   给IA 加入out 就可以正常 IA<out T>


            var ba = new BaseA();
            A a = (A)ba;
            var b = new B<A>();
            IA<A> ib = (IA<A>)b;


            Console.WriteLine("Hello World!");
        }
    }

    public class BaseA { }
    
    public class A:BaseA { }

    public interface IA< in T>
    {
        //  T GetValue(T t);
        // T GetValue(string t);
        //IA 加了 out就会报错  T GetValue(T t);//编译失败 T不能作为形参输入，用out约束T支持协变，T可以作为返回值输出

        void GetValue(T t);
        //T GetValue(T t);//编译失败 T不能作为返回值输出，用in约束T支持逆变，T可以作为返回值输出

    }

    public class B<T> : IA<T>
    {
        //public T GetValue(T t)
        //{
        //    return t; 
        //}
        public void GetValue(T t)
        {
        }
    }


}
